Још неки примери¶
Нудимо вам и пар додатних примера који могу да буду интересантни за проучавање, играње, или као полазне идеје за ваше пројекте.
У овој лекцији неће бити нових ствари које треба научити, али то (наравно) не значи да смо научили све. Као што и наслов приручника каже, све што смо до сада прешли треба посматрати као увод и основу за даље стицање знања и вештина.
Палачинке¶
На левој страни се налазе правоугаоници различите величине, један на другом. Кликом на дугме >
пребацујемо највиши правоугаоник на врх десне гомиле (која је на почетку празна). Кликом на дугме <<
пребацујемо целу десну гомилу на врх леве стране. Циљ је да се на левој страни појаве правоугаоници сложени по величини (највећи доле, најмањи горе).
Користићемо два оквира за слику, један прислоњен уз леву, а други уз десну ивицу прозора. У средњем делу прозора поставћемо четири дугмета. Два од њих су описана у поставци задатка и потребна су за само играње игре, а остала два дугмета ће служити за ресетовање текуће игре (играње од почетка), односно за почињање нове игре. Изнад дугмади пстављамо лабелу која показује број одиграних потеза, а испод дугмади лабелу која приказује поруку честитања после успешно одигране игре.
Овај пример је посебан по томе што у њему нисмо обрађивали догађаје миша или тастатуре, корисник игра игру само кликовима на дугмад. Такође, ово нам је једини пример у коме користимо два ковира за слику. Тиме смо постигли да помоћу исте функције (NacrtajPalacinke) цртамо правоугаонике и на једној и на другој страни. Избегавањем редунданце (понављања делова програма) код постаје лакши за одржавање. То значи да је олакшано мењање програма, било да је реч о исправљању грешака, или уграђивању нових идеја, односно захтева.
Иако је програм релативно дугачак, свака од функција је довољно кратка и једноставна да више не би требало да вам буде проблем да их разумете и без објашњења.
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Palacinke
{
public partial class Form1 : Form
{
const int BrojPalacinki = 10;
List<int> PocetnaLista = new List<int>();
List<int> LevaLista = new List<int>();
List<int> DesnaLista = new List<int>();
int BrojKlikova = 0;
Random Rnd = new Random();
public Form1()
{
InitializeComponent();
Text = "Palačinke";
BackColor = Color.FromArgb(23, 187, 156);
pictureBox1.BackColor = Color.FromArgb(23, 187, 156);
pictureBox2.BackColor = Color.FromArgb(23, 187, 156);
btnJednuDesno.Enabled = false;
btnSveLevo.Enabled = false;
btnIspocetka.Enabled = false;
}
private void NacrtajPalacinke(PictureBox pb, List<int> palacinke, PaintEventArgs e)
{
int d = 16;
int y = pb.Height - 3 * d;
Graphics g = e.Graphics;
Brush cetka = new SolidBrush(Color.Yellow);
foreach (int n in palacinke)
{
int x = (pb.Width - n * d) / 2;
g.FillRectangle(cetka, x, y, n * d, d);
y -= d;
}
}
private void btnNova_Click(object sender, EventArgs e)
{
PocetnaLista.Clear();
LevaLista.Clear();
DesnaLista.Clear();
for (int i = 0; i < BrojPalacinki; i++)
PocetnaLista.Add(i + 1);
PocetnaLista = PocetnaLista.OrderBy(a => Rnd.Next()).ToList(); // Promesaj
LevaLista.AddRange(PocetnaLista);
btnJednuDesno.Enabled = true;
btnSveLevo.Enabled = true;
btnIspocetka.Enabled = true;
BrojKlikova = 0;
lblBrojKlikova.Text = BrojKlikova.ToString();
lblCestitka.Text = "";
Invalidate();
}
private void btnIspocetka_Click(object sender, EventArgs e)
{
LevaLista.Clear();
DesnaLista.Clear();
LevaLista.AddRange(PocetnaLista);
btnJednuDesno.Enabled = true;
btnSveLevo.Enabled = true;
BrojKlikova = 0;
lblBrojKlikova.Text = BrojKlikova.ToString();
lblCestitka.Text = "";
Invalidate();
}
private void btnJednuDesno_Click(object sender, EventArgs e)
{
if (LevaLista.Count > 0)
{
BrojKlikova++;
lblBrojKlikova.Text = BrojKlikova.ToString();
DesnaLista.Add(LevaLista.Last());
LevaLista.RemoveAt(LevaLista.Count - 1);
Invalidate();
}
}
private void btnSveLevo_Click(object sender, EventArgs e)
{
if (DesnaLista.Count > 0)
{
BrojKlikova++;
lblBrojKlikova.Text = BrojKlikova.ToString();
LevaLista.AddRange(DesnaLista);
DesnaLista.Clear();
bool opadajuci = true;
for (int i = 1; i < LevaLista.Count; i++)
{
if (LevaLista[i] > LevaLista[i - 1])
{
opadajuci = false;
break;
}
}
if (opadajuci)
{
btnJednuDesno.Enabled = false;
btnSveLevo.Enabled = false;
lblCestitka.Text = "Bravo!";
}
Invalidate();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
NacrtajPalacinke(pictureBox1, LevaLista, e);
}
private void pictureBox2_Paint(object sender, PaintEventArgs e)
{
NacrtajPalacinke(pictureBox2, DesnaLista, e);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
pictureBox1.Invalidate();
pictureBox2.Invalidate();
}
}
}
Вешала¶
Користићемо следеће контроле:
Дугме btnNovaIgra, којим се покреће нова игра;
Текстуално поље txtPojam, у коме први играч задаје реч;
Дугме btnKrajUnosa, којим први играч саопштава програму да је завршио задавање речи;
Лабела lblPolupogodjeno садржи део речи који је други играч погодио;
Лабела lblPromasaji, која садржи неуспеле покушаје другог играча да погоди слова задате речи;
Лабела lblPromasajiTekst садржи реч „Promašaji”;
Лабела lblUputstvo, у којој се појављује текст, који појашњава играчима шта треба да раде. Овај текст се мења у току рада програма, могуће вредности су „Pogađač neka ne gleda, zadavač neka unese pojam” (упутство првом играчу на почетку нове игре), „Pogađajte pojam” (упутство другом играчу), „😀” (када други играч погоди реч), и „🙁” (када други играч не успе да погоди реч).
Пошто није могуће мењати појединачна слова стринга, да би програм био једноставнији и ефикаснији, за полупогођен појам и списак слова-промашаја уместо стрингова користимо низове карактера (char[] PolupogodjenPojam; char[] Promasaji;), па их након сваког ажурирања конвертујемо у стрингове ради приказивања.
У објашњавање самог кода се нећемо упуштати, верујемо да ћете и самостално успети да разумете све детаље.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Vesala
{
public partial class Form1 : Form
{
const int UKUPNO_POKUSAJA = 6;
char[] PolupogodjenPojam;
char[] Promasaji;
bool PogadjanjeJeUToku = false;
int PreostaloPokusaja;
public Form1()
{
InitializeComponent();
ClientSize = new Size(600, 250);
Text = "Vešala";
BackColor = Color.FromArgb(23, 187, 156);
NovaIgra();
}
private void NovaIgra()
{
txtPojam.Visible = true;
btnKrajUnosa.Visible = true;
btnNovaIgra.Visible = false;
lblPromasajiTekst.Visible = false;
lblPromasaji.Visible = false;
lblPolupogodjeno.Visible = false;
lblUputstvo.Text = "Pogađač neka ne gleda, zadavač neka unese pojam";
txtPojam.Text = "";
PreostaloPokusaja = UKUPNO_POKUSAJA;
PogadjanjeJeUToku = false;
txtPojam.Focus();
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!PogadjanjeJeUToku)
return;
char pokusaj = Char.ToUpper(e.KeyChar);
foreach (var stariPromasaj in Promasaji)
if (pokusaj == stariPromasaj)
return; // ovo slovo je vec pokusano
bool nadjeno = false;
for (int i = 0; i < txtPojam.Text.Length; i++)
if (txtPojam.Text[i] == pokusaj)
{
PolupogodjenPojam[i] = pokusaj;
nadjeno = true;
}
if (nadjeno)
{
lblPolupogodjeno.Text = new string(PolupogodjenPojam);
if (lblPolupogodjeno.Text == txtPojam.Text)
{
PogadjanjeJeUToku = false;
lblUputstvo.Text = "😀"; // uspesan kraj
}
}
else
{
Promasaji[UKUPNO_POKUSAJA - PreostaloPokusaja] = pokusaj;
PreostaloPokusaja--; // pogadjac gubi jedan zivot
lblPromasaji.Text = new string(Promasaji);
if (PreostaloPokusaja == 0)
{
PogadjanjeJeUToku = false;
lblUputstvo.Text = "🙁"; // Neuspesan kraj
}
}
}
private void btnNovaIgra_Click(object sender, EventArgs e)
{
NovaIgra();
}
private void btnKrajUnosa_Click(object sender, EventArgs e)
{
txtPojam.Visible = false;
btnKrajUnosa.Visible = false;
btnNovaIgra.Visible = true;
lblPromasajiTekst.Visible = true;
lblPromasaji.Visible = true;
lblPolupogodjeno.Visible = true;
lblUputstvo.Text = "Pogađajte pojam";
lblPromasaji.Text = new string('.', UKUPNO_POKUSAJA);
Promasaji = lblPromasaji.Text.ToCharArray();
txtPojam.Text = txtPojam.Text.ToUpper();
PolupogodjenPojam = new char[txtPojam.Text.Length];
for (int i = 0; i < txtPojam.Text.Length; i++)
PolupogodjenPojam[i] = txtPojam.Text[i] == ' ' ? ' ' : '-';
lblPolupogodjeno.Text = new string(PolupogodjenPojam);
PogadjanjeJeUToku = true;
}
}
}
Овим смо завршили наше путовање кроз Приручник. Надамо се да сте нешто научили, да вам је било занимљиво и да имате гомилу идеја за програме и жељу да те програме напишете. Још једном вам желимо забавно и успешно програмирање!